# 上节课回顾
# 列表 取值-> 1.index 索引取单个值  2. slice 切片取一些值，取出来的还是一个列表
# 相关学习链接：https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range
#字符串也有序列所以有索引 因此可以用切片的方法取部分字符串
names = "Alex,Mary,Jan"
# 索引    0123456789....
names_list = ["Alex","Mary","Jan"]   # 对比列表的索引
# 索引            1    2      3
print(names[0])    # A
print(names_list[0])   # Alex
print(names[0:4])    # Alex

# python 中的一切皆是对象 (数字、字符串、函数、模块)
# 列表的使用方法    （列表的方法是会改变列表的）
# 列表可能包含不同类型的对象，但一般这些对象都有相同的类型（也就是说一般情况下一个列表内包含的是同一种类型的对象）
# 列表是可以有重复值存在

# 1.列表——增加
#  append()  增加元素到list的末位 按增加的顺序依次在末位排列
#            一般用来新建列表会使用到
names = ["Mike","Mary","Jan","Jack"]
names.append("kiki")
print(names)   #  ['Mike', 'Mary', 'Jan', 'Jack', 'kiki']
names.append("Coco")
print(names)    # ['Mike', 'Mary', 'Jan', 'Jack', 'kiki', 'Coco']

#案例：
names_J = []  # 建一个空列表
names = ["Mike","Mary","Jan","Jack"]
for i in names:  # 利用for循环把列表的每个元素取出 赋给新变量i
    if i[0] == "J":   #判断 ：是否变量i被赋予的对象（此时对象为字符串 是一个有序的序列）的索引位置为0的那个元素=”J“
        names_J.append(i)    # 是的话 就把i所对应的那个对象添加到空列表中
print(names_J)   # ['Jan', 'Jack']

# 2. 列表——插入元素
# list.insert(要插入的位置的索引值,要插入的元素)
names = ["Mike","Mary","Jan","Jack"]
names.insert(2,"Lihua")
print(names)   # ['Mike', 'Mary', 'Lihua', 'Jan', 'Jack']

# 3.列表——删除/移除
# list.remove(要删除的对象)  : 使用之前，应该先判断该元素是否在list中用（in查询）
#             remove删去的是列表中重复值的第一个（一次只能删一个）
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
print(names)
names.remove("ZZ")
print(names)  # ['Mike', 'Mary', 'Jack', 'ZZ', 'kiki']
# in查询拓展
names = ['Mike', 'Mary', 'Lihua', 'Jan', 'Jack']
print("Lihua" in names)  # 查询Lihua是否在列表中，在就会打印出True ，否则打印False
# 案例(删去所有的重复值用remove方法)
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
names_user = input("删除内容：")
while True:
    if names_user in names:
        names.remove(names_user)
    else:
        break
print("删除后的列表：",names)

# 4.列表——删除
#   list.pop(要删去对象的索引值)    : list.pop()括号内不填内容的话，默认会删去列表的最后一个对象  --> 对应记忆：append() 默认在列表末位添加对象
#   pop()同样也是一次删去一个对象
#   利用pop删去重复值就要用到枚举  -->《知识点_列表的高级用法之枚举》
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
names.pop()  # 删去最后一个
print(names)  # ['Mike', 'Mary', 'ZZ', 'Jack', 'ZZ']
names.pop(3)   # 删去Jack
print(names)   # ['Mike', 'Mary', 'ZZ', 'ZZ']

# 和 pop()功能相似的另外一个方法 del
# del指定列表中的某个对象的索引值进行删除
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
del names[1] # 写法： del list[要删除对象的索引值！！！此处一定不能为空]
print(names)  # ['Mike', 'ZZ', 'Jack', 'ZZ', 'kiki']

# index 索引的拓展
# 写法：str.index(str, 开始索引（默认从0），结束索引（默认为字符串的长度）)  --> (str,检索范围 不写就默认为全部)
# 字符串中的index：
favor = "i like cat"  # 注意空格也属于字符串
print(favor.index("e"))  # 5
# 列表中的index：
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
print(names.index("ZZ")) # 2(这个是列表中第一个ZZ的索引位置)

# 5.列表——排序
# list.sort()   :默认从小到大排序
# reverse = Fales(默认)  小-->大
# reverse = True   大-->小
stu_score = [90,89,95,100,96,93,82]
stu_score.sort()
print(stu_score)  # [82, 89, 90, 93, 95, 96, 100]
stu_score.sort(reverse = True)
print(stu_score)  # [100, 96, 95, 93, 90, 89, 82]
# 当列表为字符串文本时  排序方式以每个字符串的首字母按ASCII编码表的顺序
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
names.sort()
print(names)  # ['Jack', 'Mary', 'Mike', 'ZZ', 'ZZ', 'kiki']

# 6.列表——查看对象的次数
# list.count()
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
print(names.count("ZZ"))
stu_score = [90,89,90,100,96,93,82,90,91,98,99,90]
print(stu_score.count(90))

# 7.列表——清空
# list.clear()
names = ["Mike","Mary","ZZ","Jack","ZZ","kiki"]
names.clear()
print(names)  # []

# 8.列表——合并
# list.extend()   : 列表合并是有顺序的，先操作哪个列表 那个列表就先在前面
names1 = ["A","B","C"]
names2 = ["D","E"]
names1.extend(names2)  # 这里是在names1中调用names2 相当于先操作的是names1 (list2.extend(list1)  这样就说明列表2一定在列表1前面)
print(names1)  # ['A', 'B', 'C', 'D', 'E']

nums = [5,4]
nums.extend([3,2,1])
print(nums)   # [5, 4, 3, 2, 1]

# 9.列表——修改
# 直接找到列表中某个对象 确定其索引值，然后用赋值的方式把新对象赋给列表要替换的那个值
names3 = ["A","B","C","D","E"]
names3[2] = "G"
print(names3)  # ['A', 'B', 'G', 'D', 'E']

# 课本对应项目解析：将“Don't panic”-->"on tap"
phrase = "Don't panic!"  # 将字符串赋给变量
plist = list(phrase)     #  str 转换 list 使用的方法是 list(str)
print(phrase)
print(plist)
for i in range(4):    # for循环执行4次 删除末位 使用的方法 pop()
    plist.pop()
print(plist)    # 删去后的结果['D', 'o', 'n', "'", 't', ' ', 'p', 'a']
plist.pop(0)
print(plist)  # ['o', 'n', "'", 't', ' ', 'p', 'a']
plist.remove("'")
print(plist)  # ['o', 'n', 't', ' ', 'p', 'a']
# extend ==>plist + [plist.pop(),plist.pop()]
plist.extend([plist.pop(),plist.pop()])  # ptyhon运算是有顺序的，先算小括号再运算大括号
# ['o', 'n', 't', ' '] a        p      # 理解为 先将末位的a和p依次用pop取出 取出时将变为对象了，这时再将这两个字母变为列表加上[],最后再合并到plist中去
print(plist)  # ['o', 'n', 't', ' ', 'a', 'p']
plist.insert(2,plist.pop(3))        # 用插入的方法把删除了的空格再插入进列表指定位置
print(plist)  # ['o', 'n', ' ', 't', 'a', 'p']
new_phrase = ''.join(plist)     # 最后只要把列表变为字符串 用join方法 ： ''.join(list) 引号里的是指列表对象转换为字符串后用什么来连接的条件
print("这是新列表=",plist)  # 用列表的方法会改变列表的内容
print(new_phrase)
